【PHP】クラス(class) - オブジェクトの設計書を定義・生成する
PHPプログラミングに“クラス”と呼ぶ仕組みがあります。
クラスを使うことでモノ・事柄をオブジェクトとして扱うことができます。
ここでは、クラスについて解説します。
検証環境
クラス
クラスは“オブジェクトの設計書”です。
オブジェクトはモノや事柄のことで、クラスは変数や処理を使ってオブジェクトの設計書を表現します。
また、クラスはオブジェクト指向プログラミングという設計思想で頻繁に使います。
オブジェクト指向プログラミングは処理をモデル化し、複数のクラス・オブジェクトを組み合わせて1つのプログラムを構築します。
この設計思想を理解するには様々な開発の知識が必要なため、説明は割愛します。
ここではクラスそのものについて解説します。
オブジェクト
オブジェクトは“具体的なモノや事柄”です。
モノや事柄の設計書がクラスであるのに対し、オブジェクトは具体的な実態を意味します。
プログラミングにおいて、オブジェクト(実態)はクラス(設計書)を元に生成することができます。
イメージとしては、料理に近く、例えばカレーを作る場合、レシピがクラス、レシピに沿って作られたカレーがオブジェクトです。
また、プログラム上のオブジェクトを“インスタンス”と呼ぶことがあります。
オブジェクトはプログラミング関係なくモノ・事柄の実態を指し、インスタンスはプログラミング上のオブジェクトである値(データ)そのものを指します。
オブジェクトとインスタンスは同義で使われることが多くありますが、厳密には異なることを覚えておくと良いでしょう。
クラスの定義
クラスを使うには、定義が必要です。
基本構文
class クラス名 {
}
クラス名
は変数と同様にルールに従って、任意の名称に決めることができます。
ルールは正規表現で表され^[a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*$
のように定められていますが、少し覚えにくいので、次のように解釈しておくと良いでしょう。
- 使用可能な文字はアルファベット(大文字・小文字)・数字・アンダースコア(_)
- 頭文字はアルファベットまたはアンダースコア(_)のみ
- 予約語以外(予め決まった意味を持つ単語)
サンプル
<?php
___ih_hl_start
class Person {
}
___ih_hl_end
?>
$ php sample.php
$
3〜5行目がクラスの定義です。
クラス名がPerson
のクラスを定義しています。
定義のみではプログラムの処理に影響しないため、正常に実行できます。
オブジェクトの生成
クラスからオブジェクトを生成します。
基本構文
new クラス名()
オブジェクトの生成はnew
キーワードを使用します。
クラス名
の部分は生成するオブジェクトのクラス名です。
サンプル
<?php
class Person {
}
___ih_hl_start
$person1 = new Person();
___ih_hl_end
var_dump($person1);
?>
$ php sample.php
object(Person)#1 (0) {
}
7行目がオブジェクトの生成です。
new Person()
でPerson
クラスのオブジェクトを生成し、代入演算子で$person1
に記憶しています。
実行結果の出力からも正常に生成できたことが分かります。
また、クラスは設計書なので、1つのクラスから複数のオブジェクトを生成することが可能です。
<?php
class Person {
}
$person1 = new Person();
___ih_diff_start
+$person2 = new Person();
___ih_diff_end
var_dump($person1);
___ih_diff_start
+var_dump($person2);
___ih_diff_end
?>
$ php sample.php
object(Person)#1 (0) {
}
object(Person)#2 (0) {
}
演習問題
次の実行結果になるプログラムを作成してください。
なお、下記条件を満たすものとします。
- 車クラスを作成する
- 車クラスのインスタンスを3つ生成する
- var_dump関数で出力する
object(Car)#1 (0) {
}
object(Car)#2 (0) {
}
object(Car)#3 (0) {
}
次の実行結果になるプログラムを作成してください。
なお、下記条件を満たすものとします。
- 家クラスを作成する
- 家クラスのインスタンスを3つ生成する
- var_dump関数で出力する
object(House)#1 (0) {
}
object(House)#2 (0) {
}
object(House)#3 (0) {
}